// Copyright (C) 2024 Kumo inc.
// Author: Jeff.li lijippy@163.com
// All rights reserved.
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published
// by the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program.  If not, see <https://www.gnu.org/licenses/>.
//

#pragma once

#include <kllm/core/km_context.h>
#include <kllm/config/arg.h>
#include <llama.h>
#include <turbo/flags/app.h>
#include <thread>

namespace kllm {

    struct ServiceContext {
        static KMParams  params;
        static KMContext ctx_server;
        std::unique_ptr<std::thread> ctx_runner;
        std::atomic<ServerState> state{SERVER_STATE_LOADING_MODEL};
        ParamsContext params_context;
        static void call_after_parse();

        static void clean_up();

        void start_context_async();
        void stop_context_async();

    };


    turbo::Status setup_app(turbo::cli::App *app);


}  // namespace kllm
